#include <iostream>
#include <map>
#include <string>

using namespace std;

void test_map1()
{
    // map<string, string> dict;

    // //pair构造函数
    // dict.insert(pair<string, string>("sort", "排序"));
    // pair<string, string> kv("insert", "插入");
    // dict.insert(kv);

    // //遍历
    // //map<string, string>::iterator it = dict.begin();
    // auto it = dict.begin();
    // while(it != dict.end())
    // {
    //     cout << it->first << ":" << it->second << endl;
    //     it++;
    // }

    // cout << endl;

    // //make_pair
    // //auto ret1 = dict.insert(make_pair("left", "左边"));
    // //auto ret2 = dict.insert(make_pair("left", "剩余"));

    map<string, string> dict;

    // pair构造函数
    //  dict.insert(pair<string, string>("sort", "排序"));
    //  pair<string, string> kv("insert", "插入");
    //  dict.insert(kv);

    // make_pair
    auto ret1 = dict.insert(make_pair("left", "左边"));
    auto ret2 = dict.insert(make_pair("left", "剩余"));

    // dict["operator"] = "重载"; // 插入 + 修改
    // dict["left"] = "左边/剩余"; // 修改
    // dict["erase"]; // 插入
    // cout << dict["left"] << endl; // 查找

    // C++11再讲
    dict.insert({"right", "右边"});

    //遍历
    // map<string, string>::iterator it = dict.begin();
    // while(it != dict.end())
    // {
    //     cout << it->first << ":" << it->second << endl;
    //     it++;
    // }
    // cout << endl;

    // map<string, string>::iterator it = dict.begin();
    // while(it != dict.end())
    // {
    //     cout << it->first << ":" << it->second << endl;
    //     it++;
    // }
    // cout << endl;

    // for(const auto& kv : dict)
    // {
    //     cout << kv.first << ":" << kv.second << endl;
    // }
    // cout << endl;

    // for(const auto& kv : dict)
    // {
    //     cout << kv.first << ":" << kv.second << endl;
    // }

    
}

// mapped_type& operator[](const key_type &k)
// {
        // pair<iterator, bool> ret = insert(make_pair(k, mapped_type()));
        // return ret.first->second;
// }


//统计次数
void test_Map2()
{
     string arr[] = {"苹果","西瓜","苹果","香蕉","葡萄","葡萄"};
    // map<string, int> countMap;
    // for(auto& str : arr)
    // {
    //     map<string, int>::iterator it = countMap.find(str);
    //     if(it != countMap.end())//存在
    //         it->second++;
    //     else//不存在
    //         countMap.insert(make_pair(str,1));
    // }


    // map<string, int> countMap;
    // for(auto& str : arr)
    // {
    //     pair<map<string, int>::iterator, bool> ret = \
    //         countMap.insert(make_pair(str, 1));

    //     if(ret.second == false)
    //         ret.first->second++;    
    // }

    // map<string, int> countMap;
    // for(auto& str : arr)
    // {
    //     pair<map<string, int>::iterator, bool> ret = \
    //         countMap.insert(make_pair(str, 1));

    //     if(ret.second == false)
    //     {
    //         ret.first->second++;
    //     }
    // }

    // map<string, int> countMap;
    // for(auto& str : arr)
    // {
    //     pair<map<string, int>::iterator, bool> ret = \
    //         countMap.insert(make_pair(str, 1));

    //     if(ret.second == false)
    //     {
    //         ret.first->second++;
    //     }
    // }


    map<string, int> countMap;
    for(auto& str : arr)
    {
        countMap[str]++;
    }




    for(const auto& kv : countMap)
    {
        cout << kv.first << ":" << kv.second << endl;
    }
}

int main()
{
    // test_map1();

    test_Map2();

    return 0;
}